// 这是一个“通过共享内存通信”的例子
package main

import (
	"fmt"
	"sync"
)

// 共享的内存
var counter int
var mutex sync.Mutex // 用于保护共享内存的锁

func increment() {
	mutex.Lock()   // 加锁，进入临界区
	counter++      // 修改共享状态（这就是“通信”的方式，隐式地告诉别人值变了）
	mutex.Unlock() // 解锁
}

func main() {
	var wg sync.WaitGroup
	for i := 0; i < 1000; i++ {
		wg.Add(1)
		go func() {
			defer wg.Done()
			increment()
		}()
	}
	wg.Wait()
	fmt.Println(counter) // 输出: 1000
}

/*
	在这个例子里，counter 就是“内存”。
	各个 Goroutine 通过争夺锁来读写 counter 的方式进行“通信”，告诉其他协程这个值已经被更新了。
	这是一种间接的、隐式的通信。
*/
